package com.geekhalo.admin.auth;

import com.geekhalo.admin.app.user.UserCommandApplication;
import com.geekhalo.admin.app.user.UserQueryApplication;
import com.geekhalo.admin.app.user.query.SearchUserQuery;
import com.geekhalo.admin.domain.user.UserView;
import com.geekhalo.admin.domain.user.changePassword.ChangePasswordCommand;
import com.geekhalo.admin.domain.user.create.CreateUserCommand;
import com.geekhalo.admin.domain.user.disable.DisableUserCommand;
import com.geekhalo.admin.domain.user.enable.EnableUserCommand;
import com.geekhalo.admin.domain.user.update.UpdateUserCommand;
import com.geekhalo.lego.core.singlequery.Page;
import com.geekhalo.lego.core.web.RestResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * 使用 react 和 antd 为前端框架
 * 用户管理功能：
 * 1. 根据用户状态和姓名进行搜索
 * 2. 对搜索结果进行分页
 * 3. 每行记录最后一列是操作列，操作包括 启动，禁用，编辑、修改密码，其中 启用和禁用 根据当前用户的状态自动为设置状态
 * 4. 点击启用、禁用 自动发送请求，以消息的方式提示操作结果，同时刷新表格重新加载数据
 * 5. 点击编辑，弹窗编辑弹窗，可编辑内容包括显示名称(showName)，点击保存后，发送请求，以消息的方式提示操作结果，关闭编辑弹窗，最后刷新表格重新加载数据
 * 6. 点击修改密码，弹窗修改密码弹窗，可编辑内容包括旧密码(password),新密码(newPassword)，点击保存后，发送请求，以消息的方式提示操作结果，关闭修改密码弹窗，最后刷新表格重新加载数据
 * 7. 表格右上角有一个“创建用户”按钮，点击后弹窗创建用户弹窗，可编辑内容包括登录名(loginName), 显示名称(showName), 密码(password)，点击保存后，发送请求，以消息的方式提示操作结果，关闭创建用户弹窗，最后刷新表格重新加载数据
 * 8. 用户信息包括：登录名(loginName), 显示名称(showName), 状态(status)
 *
 */
@RestController
@RequestMapping("adminUser")
public class AdminUserController {
    @Autowired
    private UserCommandApplication userCommandApplication;

    @Autowired
    private UserQueryApplication userQueryApplication;

    @PostMapping("search")
    public RestResult<Page<UserView>> search(@RequestBody SearchUserQuery query){
        Page<UserView> page = userQueryApplication.pageOf(query);
        return RestResult.success(page);
    }

    @PostMapping("create")
    public RestResult<Void> create(@RequestBody CreateUserCommand command){
        userCommandApplication.create(command);
        return RestResult.success();
    }

    @PostMapping("update")
    public RestResult<Void> update(@RequestBody UpdateUserCommand command){
        userCommandApplication.update(command);
        return RestResult.success();
    }
    @PostMapping("disable")
    public RestResult<Void> disable(@RequestBody DisableUserCommand command){
        userCommandApplication.disable(command);
        return RestResult.success();
    }

    @PostMapping("enable")
    public RestResult<Void> enable(@RequestBody EnableUserCommand command){
        userCommandApplication.enable(command);
        return RestResult.success();
    }

    @PostMapping("changePassword")
    public RestResult<Void> changePassword(@RequestBody ChangePasswordCommand command){
        userCommandApplication.changePassword(command);
        return RestResult.success();
    }

}
